package com.yaopaikeji.dao;

import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.yaopaikeji.constants.Constants;
import com.yaopaikeji.exception.InsertException;
import com.yaopaikeji.exception.InvalidNullException;
import com.yaopaikeji.exception.UpdateException;
import com.yaopaikeji.mapper.ContactUsMapper;
import com.yaopaikeji.model.ContactUsInfo;
import com.yaopaikeji.util.TimeUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;

@Repository
public class ContactUsDao extends BaseDao<ContactUsInfo>{

    private static Logger logger = LoggerFactory.getLogger(ContactUsDao.class);
    @Autowired
    private ContactUsMapper contactUsMapper;

    @Override
    public ContactUsInfo findByPrimaryKey(int id) {

        return contactUsMapper.findByPrimaryKey(id);
    }

    @Override
    public List<ContactUsInfo> findAll() {

        return contactUsMapper.findAll();
    }

    public ContactUsInfo saveContactUsInfo(ContactUsInfo contactUsInfo){

        if(contactUsInfo == null) {

            logger.error("contact us data is null,param="+ JSONObject.toJSON(contactUsInfo));
            throw new InvalidNullException();
        }

        if(contactUsMapper.saveContactUsInfo(contactUsInfo) == 1)
            return contactUsInfo;

        logger.error("插入数据失败,param="+JSONObject.toJSON(contactUsInfo));
        throw new InsertException(String.format(Constants.INSERT_ERROR_FMT, "联系我们"));
    }

    /**
     * 更新状态
     * @param contactUsInfo 必须包含id和status,lastModifiedTime和lastModifieder字段
     * @return
     */
    public boolean updateStatus(ContactUsInfo contactUsInfo){

        if(contactUsInfo == null) {

            logger.error("contact us data is null");
            throw new InvalidNullException();
        }

        if(contactUsMapper.updateContactUsInfo(contactUsInfo) == 1)
            return true;

        logger.error("更新状态失败,param="+JSONObject.toJSON(contactUsInfo));

        throw new UpdateException(String.format(Constants.UPDATE_ERROR_FMT, "联系我们状态"));
    }

    public List<ContactUsInfo> findByDateInterval(Date startTime,Date endTime){

        if(startTime == null || endTime == null){

            logger.error("查询日期区间不可为空,startTime="+ TimeUtil.formate(startTime)+",endTime="+TimeUtil.formate(endTime));

            throw new InvalidNullException();
        }

        return contactUsMapper.findByDateInterval(startTime,endTime);
    }

    @Transactional(readOnly = true)
    public PageInfo<ContactUsInfo> listByPage(int currentPage,int pageSize){

        PageHelper.startPage(currentPage,pageSize);
        //PageHelper设置参数，会对它后面的第一个select查询进行
        //拦截，并对sql追加limit数量限制
        return new PageInfo<>(contactUsMapper.listByPage());
    }
}
